package Message;

import java.io.*;

/**
 *   Este tipo de dados define as mensagens que são trocadas entre os clientes e o servidor numa solução do Problema
 *   dos Barbeiros Sonolentos que implementa o modelo cliente-servidor de tipo 2 (replicação do servidor) com lançamento
 *   estático dos threads barbeiro.
 *   A comunicação propriamente dita baseia-se na troca de objectos de tipo Message num canal TCP.
 */
public class Message implements Serializable {

    /**
     *  Chave de serialização
     *    @serialField serialVersionUID
     */
    private static final long serialVersionUID = 1001L;
//    public static final int STORE = 1;
//    public static final int WORKSHOP = 2;
//    public static final int GSTATE = 3;
//    public static final int LOGGER = 4;

    public enum invokesStore {

        endOperCustomer, goShopping, inShoping, isDoorOpen, isDonaIsDead, enterShop, perusingAround, iWantThis, exitShop, ACK
    }

    public enum invokesWorkShop {

        endOperCraftsman, collectMaterials, backToWork, prepareToProduce, goToStore
    }

    public enum invokesGeneralState {

        primeMaterialsNeeded, batchReadyForTransfer, appraiseSit
    }

    public enum invokesLogger {
    }

    /* Campos das mensagens */
    /**
     *  Tipo da mensagem
     *    @serialField msgType
     */
    private invokesStore msgTypeS = null;
    private invokesWorkShop msgTypeWS = null;
    private invokesGeneralState msgTypeGS = null;
    private invokesLogger msgTypeL = null;
    private int nProducts = -1;
    /**
     *  Identificação do cliente
     *    @serialField custId
     */
    private int custId = -1;
    /**
     *  Identificação do artesao
     *    @serialField craftId
     */
    private int craftId = -1;
    /**
     *  Nome do ficheiro de logging
     *    @serialField fName
     */
    private String fName = null;

    /**
     *  Instanciação de uma mensagem (forma 1).
     *
     *    @param type tipo da mensagem
     */
    public Message(invokesStore type) {
        msgTypeS = type;
    }

    public Message(invokesWorkShop type) {
        msgTypeWS = type;
    }

    public Message(invokesGeneralState type) {
        msgTypeGS = type;
    }

    public Message(invokesLogger type) {
        msgTypeL = type;
    }

    /**
     *  Instanciação de uma mensagem (forma 2).
     *
     *    @param type tipo da mensagem
     *    @param id identificação do cliente
     */
    public Message(invokesStore type, int id) {
        msgTypeS = type;
        custId = id;
    }

    public Message(invokesStore type, int id, int ng) {
        msgTypeS = type;
        custId = id;
        nProducts = ng;
    }

    public Message(invokesWorkShop type, int id) {
        msgTypeWS = type;
        craftId = id;
    }

    /**
     *  Obtenção do valor do campo tipo da mensagem.
     *
     *    @return tipo da mensagem
     */
    public invokesStore getTypeS() {
        return msgTypeS;
    }

    public invokesWorkShop getTypeWS() {
        return msgTypeWS;
    }

    public invokesGeneralState getTypeGS() {
        return msgTypeGS;
    }

    public invokesLogger getTypeL() {
        return msgTypeL;
    }

    /**
     *  Obtenção do valor do campo identificador do cliente.
     *
     *    @return identificação do cliente
     */
    public int getCustId() {
        return custId;
    }

    public int getCraftId() {
        return craftId;
    }

    public int getnProducts() {
        return nProducts;
    }

    /**
     *  Obtenção do valor do campo nome do ficheiro de logging.
     *
     *    @return nome do ficheiro
     */
    public String getFName() {
        return (fName);
    }

    /**
     *  Impressão dos campos internos.
     *  Usada para fins de debugging.
     *
     *    @return string contendo, em linhas separadas, a concatenação da identificação de cada campo e valor respectivo
     */
    @Override
    public String toString() {
        return ("Tipo = " + msgTypeS
                + "\nId Cliente = " + custId
                + "\nId Barbeiro = " + craftId
                + "\nNome Fic. Logging = " + fName);
    }
}
